import Router from "next/router";
import requewt from "@/utils/requewt";
import { API, REDIRECT_COVER, REDIRECT_DESC, REDIRECT_TITLE, REDIRECT_URL } from "@/config";
import callFeedback from "@/components/common/modalFeedback";
import { Button, Toast } from "antd-mobile";
import useApp from "@/stores/useApp";

export * from "./wechat"

export const reloadSession = () => {
  const event = new Event("visibilitychange");
  document.dispatchEvent(event);
};

/**
 * 滑动验证
 * @param cb 回调方法
 * @param [record] 回调用到的参数
 * @constructor
 */
export const HC = (cb, record) => {
  // 阻止重复加载dom
  const exist = document.getElementById(`nc`).hasChildNodes();
  if (exist) return;
  if (typeof window !== `undefined` && typeof initAliyunCaptcha === `undefined`) return;
  
  if (exist) return;
  // function (cb) {
    // 空间推理人机验initSlider证
   let captcha;
    // 绑定验证码实例函数。该函数为固定写法，无需修改
    function getInstance(instance) {
     captcha = instance;
   }
   initAliyunCaptcha({
     SceneId: 'b27hm7yz', // 场景ID。根据步骤二新建验证场景后，您可以在验证码场景列表，获取该场景的场景ID
     prefix: '2ey129', // 身份标。开通阿里云验证码2.0后，您可以在控制台概览页面的实例基本信息卡片区域，获取身份标
     mode: 'embed', // 验证码模式。popup表示要集成的验证码模式为弹出式。无需修改
     element: '#nc', //页面上预留的渲染验证码的元素，与原代码中预留的页面元素保持一致。
     button: '#btn', // 触发验证码弹窗的元素。button表示单击登录按钮后，触发captchaVerifyCallback函数。您可以根据实际使用的元素修改element的值
     immediate:true,
     captchaVerifyCallback: async (captchaVerifyParam) => {
       await cb(captchaVerifyParam)
       return {
         bizResult:true,
         captchaResult:true
       }
     }, // 业务请求(带验证码校验)回调函数，无需修改
     onBizResultCallback: (bizResult) => {
       // console.log('if else')
       if (bizResult) {
         
       } else {
 
       }
     }, // 业务请求结果回调函数，无需修改
     getInstance: getInstance, // 绑定验证码实例函数，无需修改
     slideStyle: {
       width: 360,
       height: 40,
     }, // 滑块验证码样式，支持自定义宽度和高度，单位为px。其中，width最小值为320 px
     language: 'cn', // 验证码语言类型，支持简体中文（cn）、繁体中文（tw）、英文（en）
   })
  return
  if (exist) return;
  // 滑块人机验证
  var nc_token = ["FFFF0N0000000000B5BA", (new Date()).getTime(), Math.random()].join(':');
  var nc=NoCaptcha.init({
      renderTo: '#nc',
      appkey: 'FFFF0N0000000000B5BA', 
      scene: 'nc_login_h5',
      token: nc_token,
      trans: {"key1": "code200"},
      elementID: ["usernameID"],
      is_Opt: 0,
      language: "cn",
      timeout: 10000,
      retryTimes: 5,
      errorTimes: 5,
      inline:false,
      apimap: {
          // 'analyze': '//a.com/nocaptcha/analyze.jsonp',
          // 'uab_Url': '//aeu.alicdn.com/js/uac/909.js',
      },
      bannerHidden:false,
      initHidden:false,
      callback: function (data) {
        console.log(data,'dataaaa')
          window.console && console.log(nc_token)
          window.console && console.log(data.csessionid)
          window.console && console.log(data.sig)
          const { csessionid:sessionId,sig,value:token } = data
          cb({sessionId,sig,token: nc_token,scene: 'nc_login_h5'})
      },
      error: function (s) {
      }
  });
  NoCaptcha.setEnabled(true);
  nc.reset();//请务必确保这里调用一次reset()方法

  NoCaptcha.upLang('cn', {
      'LOADING':"加载中...",//加载
      'SLIDER_LABEL': "请向右滑动验证",//等待滑动
      'CHECK_Y':"验证通过",//通过
      'ERROR_TITLE':"非常抱歉，这出错了...",//拦截
      'CHECK_N':"验证未通过", //准备唤醒二次验证
      'OVERLAY_INFORM':"经检测你当前操作环境存在风险，请输入验证码",//二次验证
      'TIPS_TITLE':"验证码错误，请重新输入"//验证码输错时的提示
  });
  // 空间推理人机验证
  // let captcha;
  //  // 绑定验证码实例函数。该函数为固定写法，无需修改
  //  function getInstance(instance) {
  //   captcha = instance;
  // }
  // initAliyunCaptcha({
  //   SceneId: 'b27hm7yz', // 场景ID。根据步骤二新建验证场景后，您可以在验证码场景列表，获取该场景的场景ID
  //   prefix: '2ey129', // 身份标。开通阿里云验证码2.0后，您可以在控制台概览页面的实例基本信息卡片区域，获取身份标
  //   mode: 'embed', // 验证码模式。popup表示要集成的验证码模式为弹出式。无需修改
  //   element: '#nc', //页面上预留的渲染验证码的元素，与原代码中预留的页面元素保持一致。
  //   button: '#btn', // 触发验证码弹窗的元素。button表示单击登录按钮后，触发captchaVerifyCallback函数。您可以根据实际使用的元素修改element的值
  //   immediate:true,
  //   captchaVerifyCallback: async (captchaVerifyParam) => {
  //     console.log(captchaVerifyParam,'captchaVerifyParam')
  //     await cb({captchaVerifyParam})
  //     return {
  //       bizResult:true,
  //       captchaResult:true
  //     }
  //   }, // 业务请求(带验证码校验)回调函数，无需修改
  //   onBizResultCallback: (bizResult) => {
  //     // console.log('if else')
  //     if (bizResult) {
        
  //     } else {

  //     }
  //   }, // 业务请求结果回调函数，无需修改
  //   getInstance: getInstance, // 绑定验证码实例函数，无需修改
  //   slideStyle: {
  //     width: 360,
  //     height: 40,
  //   }, // 滑块验证码样式，支持自定义宽度和高度，单位为px。其中，width最小值为320 px
  //   language: 'cn', // 验证码语言类型，支持简体中文（cn）、繁体中文（tw）、英文（en）
  // })
  // 按压人机验证
  // AWSC.use("ic", function (state, module) {
  //   console.log(`state`, state);
  //   // 初始化
  //   window.ic = module.init({
  //     appkey: "FFFF0N0000000000B5BA",
  //     scene: "ic_activity_h5",
  //     renderTo: "nc",
  //     width: `100%`,
  //     success: function (data) {
  //       const {sessionId, sig, token} = data;
  //       cb({
  //         sessionId,
  //         sig,
  //         token,
  //         scene: "ic_activity_h5"
  //       }, record);
  //     },
  //     // 滑动验证失败时触发该回调参数。
  //     fail: function (failCode) {
  //       Toast.show({content: `验证失败！`})
  //       window.console && console.log(failCode)
  //     },
  //     // 验证码加载出现异常时触发该回调参数。
  //     error: function (errorCode) {
  //       Toast.show({content: `加载失败！`})
  //       window.console && console.log(errorCode)
  //     }
  //   });
  // })
}

export const redirectTo = (context, target, _as) => {
  if (context.res) {
    // server
    // 303: "See other"
    context.res.writeHead(303, {Location: target});
    context.res.end();
  } else {
    // In the browser, we just pretend like this never even happened ;)
    if (_as) {
      return Router.replace(target, _as);
    }
    Router.replace(target);
  }
};
/**
 * 检测环境
 * @returns {string|null}
 */
export const checkENV = () => {
  let value;
  // 判断是不是APP
  if (typeof window?.QYApp !== `undefined`) {
    value = `app`
  }
  // 判断是不是小程序
  else if (global.wx?.miniProgram) {
    wx?.miniProgram.getEnv(res => {
      if (res.miniprogram) value = `mini`;
    })
  }
  return value
};

function pageReady() {
  console.log(`pageReady`)
  let value;
  if (window.__wxjs_environment === 'miniprogram') value = `mini`;
  return value
}

/**
 * 检测环境
 * @returns {Promise<'app'|'mini'|'test'>}
 */
export const checkENV2 = async () => {
  return await new Promise((resolve, reject) => {
    if (typeof window?.QYApp !== `undefined`) {
      return resolve(`app`)
    }
    // 判断是不是小程序
    else if (window.__wxjs_environment === 'miniprogram') {
      return resolve(`mini`)
    }
      // // 判断是不是小程序
      // else if (wx?.miniProgram) {
      //   return wx.miniProgram.getEnv(res => {
      //     if (res.miniprogram) resolve(`mini`);
      //     else resolve(`test`);
      //   })
      // }
      //
      // else if (!window.WeixinJSBridge || !WeixinJSBridge.invoke) {
      //   console.log(`!WeixinJSBridge`)
      //   document.addEventListener('WeixinJSBridgeReady', pageReady, false)
      // }
      // else if (window.WeixinJSBridge) {
      //   resolve(pageReady())
    // }

    else {
      return resolve(`test`)
    }
  })
};

/**
 * APP跳转
 * @param type 2资讯 4帖子 8专题 9话题
 * @param value
 */
export const appNavigate = (type, value) => {
  let params = JSON.stringify({
    jumpDataType: type,
    jumpDataValue: value
  })
  try {
    console.log('params------------')
    console.log(params)
    window.QYApp.openPage(params)
  } catch (error) {
    console.log('not in App')
  }
}

export const appTypeCheck = url => {
  let type, value;
  if (url.includes('artId')) {
    type = 2;
    value = url.split(`artId=`).pop(1);
  } else if (url.includes('postsId')) {
    type = 4;
    value = url.split(`postsId=`).pop(1);
  } else if (url.includes('topicId')) {
    type = 9;
    value = url.split(`topicId=`).pop(1);
  } else if (url.includes('specialTopicId')) {
    type = 8;
    value = url.split(`specialTopicId=`).pop(1);
  } else {
    type = 1;
    value = url;
  }
  return {type, value};
}

export const wxappNavigate = (type, value) => {
  if (type == 1 && value.includes('http')) {
    //普通H5跳转
    console.log('普通H5跳转', value);
    // uni.hideLoading();
    wx.miniProgram.navigateTo({
      url: `/pagesPublic/h5/detailH5?jumpDataVale=${encodeURIComponent(value)}`
    });
  }
  if (type == 1 && (value.includes('subscribe/subscribe') || value.includes('detail/detail_new'))) {
    //留资页，了解车辆详情页
    console.log('留资页，了解车辆详情页跳转', value);
    wx.miniProgram.navigateTo({
      url: `/${value}`
    });
  }
  if (type == 2) {
    //资讯
    console.log('资讯页跳转', value);
    wx.miniProgram.navigateTo({
      url: '/pagesFound/view/pgcDeatil?artId=' + value
    });
  }
  if (type == 4) {
    //帖子
    console.log('帖子页跳转', value);
    wx.miniProgram.navigateTo({
      url: '/pagesCommunity/dynamicDetail/index?postId=' + value
    });
  }
  if (type == 8) {
    //专题
    console.log('专题页跳转', value);
    wx.miniProgram.navigateTo({
      url: '/pagesFound/view/specialDetail?specialTopicId=' + value
    });
  }
  if (type == 9) {
    //话题
    console.log('话题页跳转', value);
    wx.miniProgram.navigateTo({
      url: '/pagesCommunity/topicDetail/index?topicId=' + value +
        `&topicName=${``}`
    });
  }
}

/**
 * 跳转对应平台的登录页 如果没有对应的平台 那就不做任何操作
 * @param {String} env
 * @returns
 */
export const navigate2Auth = (env) => {
  if (!env) return;
  if (env === `app`) return window.QYApp?.loginApp('logincallback');
  else if (env === `mini`) return wx?.miniProgram?.navigateTo({url: `/pages/user/auth`});

}

/**
 * 客户端检测
 * @returns {boolean}
 */
export const isInBrowser = () => {
  return (
    typeof window !== 'undefined' &&
    typeof window.document !== 'undefined' &&
    typeof window.document.createElement !== 'undefined'
  );
}


export const navigateTo = async (url, options) => {
  await Router.push(url, options)
}

/**
 * @description 过滤提交表单的数据
 * @param obj
 * @return {null|*}
 */
export const filter = (obj) => {
  if (!obj || JSON.stringify(obj) === `{}`) return null;
  for (let k in obj) {
    if (typeof obj[k] === `boolean`) obj[k] = Number(obj[k]);
    else if (typeof obj[k] === `string`) obj[k] = obj[k];
    else if (typeof obj[k] === `object`) {
      if (JSON.stringify(obj[k]) === `[]`) delete obj[k]
    }
    if (!isValid(obj[k])) delete obj[k]
  }
  return obj
}

/**
 * 字段是否有效
 * @param val
 * @returns {boolean}
 */
export const isValid = (val) => {
  return val !== `` && val !== null && val !== undefined
}

/**
 * 数组是否有效
 * @param {Array} arr
 * @param {Number} length
 * @return {boolean}
 */
export const isValidArr = (arr, length = 0) => {
  return arr && Array.isArray(arr) && arr.length > length
}

export const _wx_config = async (url) => {
  const resp = await requewt(`${API.wx.config}`, {
    method: `POST`,
    headers: {
      "Content-Type": "multipart/form-data"
    },
    body: {
      url
    }
  });
  if (resp?.error_code !== 0 || resp?.msg !== `ok`) return;

  return resp.data;
}

export const randomBetween = (min, max) => {
  return Math.floor(Math.random() * (max - min + 1)) + min
}

export const triggerAppShare = async () => {
  const json = {
    shareTitle: REDIRECT_TITLE,
    shareUrl: REDIRECT_URL,
    shareImg: REDIRECT_COVER,
    shareDesc: REDIRECT_DESC,
    shareType: "3",
    isImg: "0",
  }
  try {
    // 菜单分享
    window.QYApp?.shareTo(JSON.stringify(json), 'shareCallBack');
    gtag.event({
      action: 'app_share_trigger',
      category: 'Share',
      label: `APP触发发帖`,
    })
  } catch (error) {
    // Toast.show({content: JSON.stringify(error)})
  }
}

/**
 * 返回两点之间的距离 单位千米
 * @param lat1
 * @param lon1
 * @param lat2
 * @param lon2
 * @returns {number}
 */
export const calcCrow = (lat1, lon1, lat2, lon2) => {
  let R = 6371; // km
  let dLat = toRad(lat2 - lat1);
  let dLon = toRad(lon2 - lon1);
  lat1 = toRad(lat1);
  lat2 = toRad(lat2);

  let a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
  let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  let d = R * c;
  return d;
}

function toRad(Value) {
  return Value * Math.PI / 180;
}